//package com.cebbank.sz.cebtemplate.config;
//
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.serializer.SerializerFeature;
//import com.fasterxml.jackson.annotation.JsonAutoDetect;
//import com.fasterxml.jackson.annotation.PropertyAccessor;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cache.CacheManager;
//import org.springframework.cache.annotation.CachingConfigurerSupport;
//import org.springframework.cache.annotation.EnableCaching;
//import org.springframework.cache.interceptor.KeyGenerator;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.data.redis.cache.RedisCacheConfiguration;
//import org.springframework.data.redis.cache.RedisCacheWriter;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.core.*;
//import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
//import org.springframework.data.redis.serializer.RedisSerializationContext;
//import org.springframework.data.redis.serializer.StringRedisSerializer;
//import org.springframework.util.ClassUtils;
//
//import java.net.URI;
//import java.net.URL;
//import java.time.Duration;
//import java.util.Date;
//import java.util.Locale;
//
///**
// * @author jaco
// * @create 2019-11-29 上午9:54
// **/
//@Configuration
//@EnableCaching
//public class RedisCacheConfig extends CachingConfigurerSupport {
//
//    @Value("${cache.prefix}")
//    private String keyPrefix ;
//
//    private final RedisConnectionFactory redisConnectionFactory;
//
//    private final static int NO_PARAM_KEY = 0;
//
//    RedisCacheConfig(RedisConnectionFactory redisConnectionFactory) {
//        this.redisConnectionFactory = redisConnectionFactory;
//    }
//
//    /**
//     * 是否不是基本类型
//     *
//     * @param clazz
//     * @return boolean
//     */
//    public static boolean isSimpleValueType(Class<?> clazz) {
//        return (ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.isEnum() || CharSequence.class.isAssignableFrom(clazz)
//                || Number.class.isAssignableFrom(clazz) || Date.class.isAssignableFrom(clazz) || URI.class == clazz
//                || URL.class == clazz || Locale.class == clazz || Class.class == clazz);
//    }
//
//    /**
//     * Java对象序列化为JSON字符串
//     *
//     * @param obj Java对象
//     * @return json字符串
//     */
//    public static String toJson(Object obj) {
//        return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue);
//    }
//
//    @Bean
//    @Override
//    public KeyGenerator keyGenerator() {
//        return (target, method, params) ->{
//            char sp = ':';
//            StringBuilder strBuilder = new StringBuilder(30);
//            strBuilder.append(keyPrefix);
//            strBuilder.append(sp);
//            // 类名
//            strBuilder.append(target.getClass().getSimpleName());
//            strBuilder.append(sp);
//            // 方法名
//            strBuilder.append(method.getName());
//            strBuilder.append(sp);
//            if (params.length > 0) {
//                // 参数值
//                for (Object object : params) {
//                    if (isSimpleValueType(object.getClass())) {
//                        strBuilder.append(object);
//                    } else {
//                        strBuilder.append(toJson(object).hashCode());
//                    }
//                }
//            } else {
//                strBuilder.append(NO_PARAM_KEY);
//            }
//            return strBuilder.toString();
//        };
//    }
//
//    /**
//     * <p>SpringBoot配置redis作为默认缓存工具</p>
//     * <p>SpringBoot 2.0 以上版本的配置</p>
//     */
//    @Bean
//    public CacheManager cacheManager(RedisTemplate<String, Object> template) {
//        RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
//                .entryTtl(Duration.ofMinutes(30))
//                .disableCachingNullValues()
//                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(template.getStringSerializer()))
//                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(template.getValueSerializer()));
//        return new ExtendExpireCacheManager(cacheWriter, defaultCacheConfig);
//    }
//
//    /**
//     * retemplate<String, Object>
//     */
//    @Bean(name = "template")
//    public RedisTemplate<String, Object> template(RedisConnectionFactory factory) {
//        // 创建RedisTemplate<String, Object>对象
//        RedisTemplate<String, Object> template = new RedisTemplate<>();
//        // 配置连接工厂
//        template.setConnectionFactory(factory);
//        // 定义Jackson2JsonRedisSerializer序列化对象
//        Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<>(Object.class);
//        ObjectMapper om = new ObjectMapper();
//        // 指定要序列化的域，field,get和set,以及修饰符范围，ANY是都有包括private和public
//        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        // 指定序列化输入的类型，类必须是非final修饰的，final修饰的类，比如String,Integer等会报异常
//        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//        jacksonSeial.setObjectMapper(om);
//        StringRedisSerializer stringSerial = new StringRedisSerializer();
//        // redis key 序列化方式使用stringSerial
//        template.setKeySerializer(stringSerial);
//        // redis value 序列化方式使用jackson
//        template.setValueSerializer(jacksonSeial);
//        // redis hash key 序列化方式使用stringSerial
//        template.setHashKeySerializer(stringSerial);
//        // redis hash value 序列化方式使用jackson
//        template.setHashValueSerializer(jacksonSeial);
//        template.afterPropertiesSet();
//        return template;
//    }
//
//    /**
//     * redis string
//     */
//    @Bean
//    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
//        return redisTemplate.opsForValue();
//    }
//
//    /**
//     * redis hash
//     */
//    @Bean
//    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
//        return redisTemplate.opsForHash();
//    }
//
//    /**
//     * redis list
//     */
//    @Bean
//    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
//        return redisTemplate.opsForList();
//    }
//
//    /**
//     * redis set
//     */
//    @Bean
//    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
//        return redisTemplate.opsForSet();
//    }
//
//    /**
//     * redis zset
//     */
//    @Bean
//    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
//        return redisTemplate.opsForZSet();
//    }
//
//}